home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 9
/
FM Towns Free Software Collection 9.iso
/
t_os
/
tool
/
wings
/
w2_src
/
pager.asm
< prev
next >
Wrap
Assembly Source File
|
1994-11-16
|
17KB
|
788 lines
.386p
;
VRAM_SEL equ 0120h
VRAM_OFF equ 0200h
L_LINE equ 0
TAB equ 9
CRLF equ 0A0Dh
CR equ 0Dh
LF equ 0Ah
ON equ 1
OFF equ 0
NULL equ 0
TAB_W equ 3
;
public add_ebx
public add_edi
public tab_wide
public r_line
public max_str
public l_count_1
public l_count_2
public cr_disp
extrn col_ank_tbl:word
extrn col_kan_tbl:word
extrn fnt_ank_tbl:dword
extrn fnt_kan_tbl:dword
extrn off_adr_tbl:dword
;
data segment dword 'DATA' use32
;
align 4
extrn max_line:dword
extrn pointer:dword
extrn filesize:dword
cr_disp db ON
align 4
add_ebx dd 4, 3, 2, 1, 0, 0, 0, 0
add_edi dd 12, 9, 6, 3, 0, 0, 0, 0
tab_wide dd 3
r_line dd 328/2
max_str dd 52
l_count_1 dd 39
l_count_2 dd 512-156
back_ground dd 92 dup( 0cccccccch )
jmp_tbl_1 dd ank_ok_1, chk_kan_1
jmp_tbl_2 dd ank_ok_1, kan_ok_1
jmp_tbl_3 dd ank_ok_2, chk_kan_2
jmp_tbl_4 dd ank_ok_2, kan_ok_2
jmp_tbl_5 dd ank_ok_3, chk_kan_3
jmp_tbl_6 dd ank_ok_3, kan_ok_3
;
cr_mark dd 0ccaccccch, 0cccccccch, 0ccccccach, 0ccaccccch
dd 0cccccccch, 0ccccccach, 0ccaccccch, 0cccccccch
dd 0ccccccach, 0ccaccccch, 0cccccccch, 0ccccccach
dd 0ccaccccch, 0accccccch, 0ccccacach, 0caaacccch
dd 0cccccccch, 0ccccccach
; +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
chk_tbl_1 db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
; +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
chk_tbl_2 db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0
db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0
fnt_ank dw 2*16 dup(?)
fnt_kan dd 256 dup(?)
data ends
;
code segment dword public 'CODE' use32
assume cs:code, ds:data
;----------------------------------------------------------
; void set_color( void );
;----------------------------------------------------------
public set_color
db 'set_color', 9
set_color proc near
push edi
push esi
;--- テキストカラーを決定する ---
;--- ANKカラーコードを決定 ---
mov esi, offset fnt_ank_tbl
mov edi, offset fnt_ank
xor eax, eax
mov ecx, 16
loop_01:
lodsw
mov edx, eax
not edx
and eax, 0bbbbh
and edx, 0cccch
or eax, edx
stosw
loop short loop_01
;--- 漢字カラーコードを決定 ---
mov esi, offset fnt_kan_tbl
mov edi, offset fnt_kan
mov ecx, 256
loop_02:
lodsd
mov edx, eax
not edx
and eax, 0bbbbbbbbh
and edx, 0cccccccch
or eax, edx
stosd
loop short loop_02
pop esi
pop edi
ret
set_color endp
;----------------------------------------------------------
; call_text( char *strptn, char *text, int now_line );
;----------------------------------------------------------
public call_text
db 'call_text', 9
call_text proc near
push ebp
mov ebp, esp
push ebx
push edi
push esi
push es
mov ax, VRAM_SEL
mov es, ax
;--- 画面を背景色でクリアする ---
mov eax, 0cccccccch
mov ecx, 128*512
xor edi, edi
loop_00:
stosd
loop short loop_00
;--- ファイルサイズが 0だったらジャンプ
cmp filesize, 0
je end_1
mov esi, [ebp+12]
mov eax, [ebp+16]
mov ebx, pointer
mov ecx, [ebx+eax*4]
xor ebx, ebx
xor edx, edx
xor edi, edi
loop_05:
push edi
loop_03:
mov ax, [esi+ecx]
;--- TABのチェック ---
cmp al, TAB
je tab_rtn_1
;--- CR・LFのチェック ---
cmp ax, CRLF
je crlf_rtn_1
;--- 1バイト目の漢字のチェック ---
and eax, 0ffh
mov al, chk_tbl_1+eax
jmp short [offset jmp_tbl_1+eax*4]
;--- ANK文字表示 ---
ank_ok_1:
mov al, [esi+ecx]
call put_ank
inc ebx
inc ecx
jmp_03:
;--- 1行の文字数チェック ---
cmp ebx, max_str
jb short loop_03
jmp_05:
;--- 行数のチェック ---
pop edi
inc edx
cmp edx, max_line
je end_1
cmp edx, 81
je end_1
;--- テキストポインタを次に進める
inc word ptr [ebp+16]
mov eax, [ebp+16]
mov ebx, pointer
mov ecx, [ebx+eax*4]
xor ebx, ebx
;--- 文字書き込み番地を生成する ---
cmp edx, 40
je short jmp_06
add edi, VRAM_OFF*12
jmp short loop_05
jmp_06:
mov edi, r_line
jmp short loop_05
;--- 2バイト目の漢字のチェック ---
chk_kan_1:
mov al, [esi+ecx+1]
mov al, chk_tbl_2+eax
jmp short [offset jmp_tbl_2+eax*4]
;--- 漢字表示 ---
kan_ok_1:
;--- 表示数チェック ---
mov eax, max_str
dec eax
cmp ebx, eax
jae short jmp_05
mov ax, word ptr [esi+ecx]
call put_kan
add ebx, 2
add ecx, 2
jmp short jmp_03
;--- TAB処理 ---
tab_rtn_1:
mov eax, ebx
and eax, tab_wide
add ebx, add_ebx+eax*4
add edi, add_edi+eax*4
inc ecx
jmp jmp_03
;--- CRLF処理 ---
crlf_rtn_1:
cmp cr_disp, OFF
je jmp_05
;--- check letter length
mov eax, max_str
dec eax
cmp ebx, eax
jae jmp_05
;--- put CR mark
mov eax, 0ab81h
call put_cr_mark
jmp jmp_05
;--- 終了 ---
end_1:
pop es
pop esi
pop edi
pop ebx
pop ebp
ret
call_text endp
;-----------------------------------------------------------------------------
; put_next_words( char *strptn, char *text, int off_address, int now_line );
;-----------------------------------------------------------------------------
align 4
public put_next_words
db 'put_next_words', 14
put_next_words proc near
push ebp
mov ebp, esp
push ebx
push edi
push esi
push es
mov ax, VRAM_SEL
mov es, ax
mov eax, dword ptr [ebp+16]
and eax, 0ffffff80h
shl eax, 2
add eax, 512*480
add eax, r_line
and eax, 03ffffh
mov edi, eax
;--- 事前に行を背景色クリアする ---
cld
mov ebx, 12
loop_10:
mov esi, offset back_ground
mov ecx, l_count_1
rep movsd
add edi, l_count_2
and edi, 03ffffh
dec ebx
jne short loop_10
mov edi, eax
mov eax, [ebp+20]
mov ebx, pointer
mov ecx, [ebx+eax*4]
mov esi, dword ptr [ebp+12]
xor ebx, ebx
loop_13:
mov ax, [esi+ecx]
;--- TABのチェック ---
cmp al, TAB
je tab_rtn_2
;--- CR・LFのチェック ---
cmp ax, CRLF
je crlf_rtn_2
;--- 1バイト目の漢字のチェック ---
and eax, 0ffh
mov al, chk_tbl_1+eax
jmp short [offset jmp_tbl_3+eax*4]
;--- ANK文字表示 ---
ank_ok_2:
mov al, [esi+ecx]
call put_ank
inc ebx
inc ecx
jmp_13:
;--- 1行の文字数チェック ---
cmp ebx, max_str
jb short loop_13
jmp_11:
pop es
pop esi
pop edi
pop ebx
pop ebp
ret
;--- 2バイト目の漢字のチェック ---
chk_kan_2:
mov al, [esi+ecx+1]
mov al, chk_tbl_2+eax
jmp short [offset jmp_tbl_4+eax*4]
;--- 漢字表示 ---
kan_ok_2:
;--- 表示数チェック ---
mov eax, max_str
dec eax
cmp ebx, eax
jae short jmp_11
mov ax, word ptr [esi+ecx]
call put_kan
add ebx, 2
add ecx, 2
jmp jmp_13
;--- TAB処理 ---
tab_rtn_2:
mov eax, ebx
and eax, tab_wide
add ebx, add_ebx+eax*4
add edi, add_edi+eax*4
inc ecx
jmp jmp_13
;--- CRLF処理 ---
crlf_rtn_2:
cmp cr_disp, OFF
je jmp_11
;--- check letter length
mov eax, max_str
dec eax
cmp ebx, eax
jae jmp_11
;--- put CR mark
mov eax, 0ab81h
call put_cr_mark
jmp jmp_11
put_next_words endp
;-----------------------------------------------------------------------------
; put_back_words( char *strptn, char *text, int off_address, int now_line );
;-----------------------------------------------------------------------------
align 4
public put_back_words
db 'put_back_words', 14
put_back_words proc near
push ebp
mov ebp, esp
push ebx
push edi
push esi
push es
mov ax, VRAM_SEL
mov es, ax
mov eax, dword ptr [ebp+16]
and eax, 0ffffff80h
shl eax, 2
add eax, 512*500
and eax, 03ffffh
mov edi, eax
;--- 事前に行を背景色クリアする ---
cld
mov ebx, 12
loop_20:
mov esi, offset back_ground
mov ecx, l_count_1
rep movsd
add edi, l_count_2
and edi, 03ffffh
dec ebx
jne short loop_20
mov edi, eax
mov eax, [ebp+20]
sub eax, 80
mov ebx, pointer
mov ecx, [ebx+eax*4]
mov esi, dword ptr [ebp+12]
xor ebx, ebx
loop_23:
mov ax, [esi+ecx]
;--- TABのチェック ---
cmp al, TAB
je tab_rtn_3
;--- CR・LFのチェック ---
cmp ax, CRLF
je crlf_rtn_3
;--- 1バイト目の漢字のチェック ---
and eax, 0ffh
mov al, chk_tbl_1+eax
jmp short [offset jmp_tbl_5+eax*4]
;--- ANK文字表示 ---
ank_ok_3:
mov al, [esi+ecx]
call put_ank
inc ebx
inc ecx
jmp_23:
;--- 1行の文字数チェック ---
cmp ebx, max_str
jb short loop_23
jmp_21:
pop es
pop esi
pop edi
pop ebx
pop ebp
ret
;--- 2バイト目の漢字のチェック ---
chk_kan_3:
mov al, [esi+ecx+1]
mov al, chk_tbl_2+eax
jmp short [offset jmp_tbl_6+eax*4]
;--- 漢字表示 ---
kan_ok_3:
;--- 表示数チェック ---
mov eax, max_str
dec eax
cmp ebx, eax
jae short jmp_21
mov ax, word ptr [esi+ecx]
call put_kan
add ebx, 2
add ecx, 2
jmp jmp_23
;--- TAB処理 ---
tab_rtn_3:
mov eax, ebx
and eax, tab_wide
add ebx, add_ebx+eax*4
add edi, add_edi+eax*4
inc ecx
jmp jmp_23
;--- CRLF処理 ---
crlf_rtn_3:
cmp cr_disp, OFF
je jmp_21
;--- check letter length
mov eax, max_str
dec eax
cmp ebx, eax
jae jmp_21
;--- put CR mark
mov eax, 0ab81h
call put_cr_mark
jmp jmp_21
put_back_words endp
;----------------------------------------------------------
; put ↓ mark procedure
;----------------------------------------------------------
put_cr_mark proc
push ecx
push esi
mov esi, offset cr_mark
mov ecx, 12
lp_pc0:
lodsd
stosd
lodsw
stosw
add edi, VRAM_OFF-6
and edi, 3ffffh
loop short lp_pc0
pop esi
pop ecx
ret
put_cr_mark endp
;----------------------------------------------------------
; void vsync( void );
;----------------------------------------------------------
public vsync
db 'vsync', 5
vsync proc near
mov dx, 0440h
mov al, 30
out dx, al
mov dx, 0443h
loop_18:
align 4
in al, dx
and al, 04h
je short loop_18
ret
vsync endp
;----------------------------------------------------------
; void hsync( int loop );
;----------------------------------------------------------
public hsync
db 'hsync', 5
hsync proc
push ebp
mov ebp, esp
mov ecx, [ebp+8]
lp_hs2:
mov dx, 440h
mov al, 30
out dx, al
mov dx, 443h
lp_hs0:
align 4
in al, dx
and al, 2
jne short lp_hs0
lp_hs1:
align 4
in al, dx
and al, 2
je short lp_hs1
loop short lp_hs2
pop ebp
ret
hsync endp
;----------------------------------------------------------
; crtc( char adress, short data );
;----------------------------------------------------------
public crtc
db 'crtc', 4
crtc proc near
push ebp
mov ebp, esp
mov dx, 440h
mov al, [ebp+8]
out dx, ax
mov dx, 442h
mov ax, [ebp+12]
out dx, ax
pop ebp
ret
crtc endp
;------------------------------------------------------------------------------
; void up_scroll( int offset_adress, int *new_offset_address, int speed );
;------------------------------------------------------------------------------
align 4
public up_scroll
db 'up_scroll', 9
up_scroll proc near
push ebp
mov ebp, esp
push edi
push esi
push es
;--- スクロールラインを転送する ---
mov eax, dword ptr [ebp+8]
and eax, 0ffffff80h
shl eax, 2
mov esi, eax
mov edi, eax
add esi, r_line
add edi, 512*480
and edi, 03ffffh
and esi, 03ffffh
mov ecx, l_count_1
push ds
mov ax, VRAM_SEL
mov ds, ax
mov es, ax
cld
rep movsd
pop ds
;--- オフセットアドレスを増やしてスクロール ---
mov eax, dword ptr [ebp+8]
add eax, 128
and eax, 0ffffh
mov esi, dword ptr [ebp+12]
mov [esi], eax
mov dx, 0440h
mov al, 17
out dx, al
mov eax, dword ptr [esi]
mov dx, 0442h
out dx, ax
;--- ウェイト ---
mov ecx, dword ptr [ebp+16]
jecxz short out_1
mov dx, 0440h
mov al, 30
out dx, al
mov dx, 0443h
loop_X:
align 4
in al, dx
and al, 02h
je loop_X
in al, dx
and al, 02h
jne loop_X
loop short loop_X
out_1:
pop es
pop esi
pop edi
pop ebp
ret
up_scroll endp
;--------------------------------------------------------------------------
; void down_scroll( int offset_adress, int *new_offset_address, int );
;--------------------------------------------------------------------------
align 4
public down_scroll
db 'down_scroll', 11
down_scroll proc near
push ebp
mov ebp, esp
push edi
push esi
push es
;--- スクロールラインを転送する ---
mov eax, dword ptr [ebp+8]
and eax, 0ffffff80h
shl eax, 2
mov esi, eax
mov edi, eax
add esi, 512*479
add edi, 512*511
add edi, r_line
and edi, 03ffffh
and esi, 03ffffh
mov ecx, l_count_1
push ds
mov ax, VRAM_SEL
mov ds, ax
mov es, ax
cld
rep movsd
pop ds
;--- オフセットアドレスを減らしてスクロール ---
mov eax, dword ptr [ebp+8]
sbb eax, 128
and eax, 0ffffh
mov esi, dword ptr [ebp+12]
mov [esi], eax
mov dx, 0440h
mov al, 17
out dx, al
mov eax, dword ptr [esi]
mov dx, 0442h
out dx, ax
;--- ウェイト ---
mov ecx, dword ptr [ebp+16]
jecxz short out_2
mov dx, 0440h
mov al, 30
out dx, al
mov dx, 0443h
loop_Y:
align 4
in al, dx
and al, 02h
je loop_Y
in al, dx
and al, 02h
jne loop_Y
loop short loop_Y
out_2:
pop es
pop esi
pop edi
pop ebp
ret
down_scroll endp
;--------------------------------
; put ank font
; Use esi : font pattern adress
; ecx, edx : calclation
;--------------------------------
align 4
put_ank proc near
push ebx
push ecx
push edx
push esi
mov ebx, eax
shl eax, 3
shl ebx, 2
add eax, ebx
mov esi, dword ptr [ebp+8]
add esi, eax
REPT 12
lodsb
mov ecx, eax
and ecx, 0f0h
shr ecx, 4
mov edx, eax
and edx, 0ch
mov eax, [offset fnt_ank+ecx*2]
stosw
mov eax, [offset fnt_ank+edx*2]
stosb
add edi, VRAM_OFF-3
and edi, 03ffffh
endm
sub edi, 0200h*12-3
and edi, 03ffffh
pop esi
pop edx
pop ecx
pop ebx
ret
put_ank endp
;--------------------------------
; put kanji font
; Use esi : font pattern adress
; ecx, edx : calclation
;--------------------------------
align 4
put_kan proc near
push ebx
push ecx
push edx
push esi
xor ecx, ecx
mov edx, eax
;--- SJIS to JIS
ror dx, 8
shl dh, 1
cmp dl, 080h
adc dx, 1f61h
add dl, 7fh
jc short c_01
add dl, 0a2h
c_01:
and dh, 7fh
cmp edx, 000004f54h
jb short c_02
mov edx, 02223h
c_02:
mov eax, edx
sub eax, 000002121h
shr eax, 8
mov eax, [offset off_adr_tbl+eax*4]
and edx, 0000000ffh
sub edx, 000000021h
add eax, edx
mov ebx, eax
shl eax, 4
shl ebx, 3
add eax, ebx
mov esi, dword ptr [ebp+8]
add esi, eax
REPT 12
lodsw
mov cl, al
mov dl, ah
mov eax, [offset fnt_kan+ecx*4]
stosd
mov eax, [offset fnt_kan+edx*4]
stosw
add edi, VRAM_OFF-6
and edi, 03ffffh
endm
sub edi, 0200h*12-6
and edi, 03ffffh
pop esi
pop edx
pop ecx
pop ebx
ret
put_kan endp
code ends
end